package object2;

/**
 * 方法重写/覆盖
 */
public class Override {

    public static void main(String[] args) {

        /*
            方法重写就是子类有一个方法，和父类的某个方法的名称、返回类型、参数一样
            那么就说子类的这个方法覆盖了父类的方法
         */
        Dogs dog = new Dogs();
        dog.cry();//小狗汪汪叫..

        /*
            1)子类的方法的形参列表、方法名称要和父类方法的形参列表、方法名完全一样
            2)子类方法的返回类型和父类方法返回类型一样，或者是父类返回类型的子类
              比如 父类 返回类型是 Object，子类 返回类型是 String
            3) 子类方法不饿能缩小父类方法的访问权限
         */
    }
}

class Animal {

    public void cry() {
        System.out.println("动物叫唤...");
    }

    public Object m1() {
        return null;
    }

    public String m2() {
        return null;
    }

    public AAA m3() {
        return null;
    }

    protected void eat() {

    }
}

class Dog extends Animal {

    /*
        Dog是Animal子类
        Dog的cry()方法和Animal的cry定义形式一样(名称、返回类型、参数)
        此时称Dog的cry方法重写了Animal的cry方法
     */
    public void cry() {
        System.out.println("小狗汪汪叫..");
    }

    //子类方法的返回类型和父类方法返回类型一样，或者是父类返回类型的子类
    //比如父类返回类型是Object，子类方法返回类型是String
    public String m1() {
        return null;
    }

    //Object不是String的子类，因此编译错误
//    public Object m2() {
//        return null;
//    }

    //BBB是AAA的子类,m3()改写成功
    public BBB m3() {
        return null;
    }

    //小细节：子类方法不能缩小父类方法的访问权限
    //public -> protected -> 默认 -> private
    public void eat() {

    }
}

class AAA{

}
class BBB extends AAA {

}